#include <stdio.h>
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <functional>
#include <vector>

enum
{
  OK,
  USAGE_ERR
};
void CreateChildProcess(int num,std::vector<pid_t> *subs,std::vector<std::function<void()>> &Tasks)
{
  for(int i = 0;i<num;i++)
  {
    pid_t id = fork();
    if(id == 0)
    {
      Tasks[i]();
      exit(0);
    }
    subs->push_back(id);
  }
}

void WaitAllChild(std::vector<pid_t> &subs)
{
  for(const auto& pid:subs)
  {
    int status = 0;
    pid_t rid = waitpid(pid,&status,0);
    if(rid<0)
    {
      perror("waitpid");
      exit(1);
    }
    else{
      printf("子进程：%d Exit,exit code: %d\n",rid,WEXITSTATUS(status));
    }

  }
}
int main(int argc,char* argv[])
{
  if(argc != 2)
  {
    std::cout<<"Usage:"<<argv[0]<<"process_num"<<std::endl;
    exit(USAGE_ERR);
  }
  int num = std::stoi(argv[1]);
  std::vector<pid_t> subs;

  auto PrintLog = [](){ std::cout << "printf Log" << std::endl;};
  auto SyncDisk = [](){ std::cout << "write data to disk" << std::endl;};
  auto WriteDataToMysql = [](){ std::cout << "write data to mysql" << std::endl;};
  std::vector<std::function<void()>> Tasks = {PrintLog,SyncDisk,WriteDataToMysql};

  //创建多线程
  CreateChildProcess(num,&subs,Tasks);

  //父进程
  WaitAllChild(subs);
  return 0;
}



























//void PrintLog()
//{
//    std::cout << "printf Log" << std::endl;
//}
//void SyncDisk()
//{
//    std::cout << "wirte data to disk" << std::endl;
//}
//void WriteDataToMysql()
//{
//    std::cout << "write data to mysql" << std::endl;
//}
//int main()
//{
//  printf("我是父进程：pid:%d,ppid:%d\n",getpid(),getppid());
//  auto PrintLog = [](){ std::cout << "printf Log" << std::endl;};
//  auto SyncDisk = [](){ std::cout << "write data to disk" << std::endl;};
//  auto WriteDataToMysql = [](){ std::cout << "write data to mysql" << std::endl;};
//  std::vector<std::function<void()>> tasks = {PrintLog,SyncDisk,WriteDataToMysql};
//
//  pid_t id = fork();
//
//  if(id < 0)
//  {
//    perror("fork");
//    exit(1);
//  }
//  else if(id == 0)
//  {
//    //child
//    int cnt = 5;
//    while(cnt--)
//    {
//      printf("我是子进程：pid:%d,ppid:%d\n",getpid(),getppid());
//      sleep(1);
//    }
//    exit(10);
//  
//  }
//  else{
//    //father
//    while(1)
//    {
//      int status = 0;
//      pid_t rid = waitpid(id,&status,WNOHANG);
//      if(rid>0)
//      {
//        printf("wait success,退出的子进程是：%d,exit_code:%d\n",rid,WEXITSTATUS(status));
//        break;
//      }
//      else if(rid == 0)
//      {
//        printf("子进程正在运行，父进程还需要等待！\n");
//        usleep(100000);
//        for(auto& task:tasks)
//        {
//          task();
//        }
//      }
//      else{
//        perror("waitpid");
//        break;
//      }
//
//  
//    }
//  return 0;
//  }
//}
